package cn.com.anypay.manager.miaoma.student.dto;

import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.Max;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.ToString;

/**
 * 学生分页请求DTO
 * 封装分页参数和查询条件
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class StudentPageDTO {

    /**
     * 页码（从1开始）
     */
    @Min(value = 1, message = "页码必须大于0")
    @Builder.Default
    private Integer pageNumber = 1;

    /**
     * 每页大小
     */
    @Min(value = 1, message = "每页大小必须大于0")
    @Max(value = 100, message = "每页大小不能超过100")
    @Builder.Default
    private Integer pageSize = 10;

    /**
     * 排序字段
     */
    private String sortBy;

    /**
     * 排序方向 (ASC/DESC)
     */
    @Builder.Default
    private String sortDirection = "ASC";

    /**
     * 查询条件
     */
    private StudentQueryDTO query;

    /**
     * 获取排序方向枚举
     */
    public SortDirection getSortDirectionEnum() {
        try {
            return SortDirection.valueOf(sortDirection.toUpperCase());
        } catch (Exception e) {
            return SortDirection.ASC;
        }
    }

    /**
     * 排序方向枚举
     */
    public enum SortDirection {
        ASC, DESC
    }

    /**
     * 计算偏移量（用于SQL LIMIT）
     */
    public int getOffset() {
        return (pageNumber - 1) * pageSize;
    }

    /**
     * 验证分页参数是否有效
     */
    public boolean isValidPage() {
        return pageNumber != null && pageNumber > 0 &&
               pageSize != null && pageSize > 0 && pageSize <= 100;
    }
}